// encoder.js - 通用条码编码器
// 根据结构字符串（如 'LLLL', 'RRRR', 'LGLG'）将数字编码为二进制条纹
// 支持插入分隔符（如 EAN-5 的 '01'）

import { BINARIES } from './constants.js';

/**
 * 将数字字符串编码为二进制条码序列
 * @param {string} data - 要编码的数字字符串，如 '1234'
 * @param {string} structure - 编码结构，如 'LLLL' 或 'RRRR' 或 'LGLGLG'
 * @param {string} [separator] - 可选：数字之间的分隔符（如 '01' 用于 EAN-5/EAN-2）
 * @returns {string} 完整的二进制条码字符串（如 '1010110...'）
 *
 * @example
 * encoder('1234', 'LLLL'); // 使用 L 编码表编码四位
 * encoder('12', 'RR', '01'); // 编码两位，中间插入 '01'
 */
export default function encoder(data, structure, separator = '') {
	// 将每个数字根据其结构类型（L/G/R）映射为二进制条码
	const encoded = data.split('').map((digit, idx) => {
		const type = structure[idx];
		const binaryMap = BINARIES[type];

		if (!binaryMap) {
			throw new Error(`Invalid structure type '${type}' at index ${idx}`);
		}

		const code = binaryMap[parseInt(digit, 10)];
		if (code === undefined) {
			throw new Error(
				`No binary code for digit '${digit}' with type '${type}'`
			);
		}

		return code;
	});

	// 如果有分隔符，在每两个编码之间插入（除了最后一个）
	if (separator) {
		return encoded.join(separator);
	}

	// 否则直接拼接
	return encoded.join('');
}

